home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / edit / me_cd25.zip / MUTT2.ZIP / MARKRING.MUT < prev    next >
Text File  |  1992-11-09  |  3KB  |  138 lines

  1. ;; markring.mut : Maintain a ring of marks so it is easy to jump to 
  2. ;;   often referenced places in a buffer.
  3. ;; Notes:
  4. ;;   Marking regions does not effect the ring.
  5. ;;   Each buffer has its own ring.
  6. ;;   When the ring is full, the ring wraps around.
  7. ;;   Be sure to add (markring-init) to (buffer-created-hook) and
  8. ;;     (read-file-hook).
  9. ;;   Marks may invalided without my knowing about it (eg buffer is
  10. ;;     cleared).  This would make (goto-mark) choke.
  11. ;;   Data structure:
  12. ;;     A list of mark ids acting like a stack:
  13. ;;     oldest mmark -> element0, element1, ..., elementn <- youngest mark
  14. ;;     When a mark is set, it is put at the end of the stack.
  15. ;;     When popping a mark, take it off the start of the stack.
  16. ;; Uses:
  17. ;;   Buffer variables:
  18. ;;     mark-ring:  list of mark ids.
  19. ;; C Durland  rewritten to use lists: 9/91    Public Domain
  20. ;;     Changed from queues to stacks: 2/92
  21.  
  22. (include me2.h)
  23.  
  24. (const
  25.   NUMBER-OF-MARKS-IN-RING    4
  26. )
  27.  
  28. (defun
  29.   markring-init
  30.   {
  31.     (create-buffer-var LIST "mark-ring")
  32.     (markring-reset)
  33.   }
  34.   markring-reset    HIDDEN
  35.   {
  36.     (int num-marks n)
  37.     (list ring)
  38.  
  39. ;    (ring (loc (buffer-var "mark-ring")))
  40.     (ring (buffer-var "mark-ring"))
  41.     (num-marks (length-of ring))
  42.  
  43.     (for (n 0) (< n num-marks) (+= n 1) (free-mark (extract-element ring n)))
  44.     (remove-elements ring 0 1000)
  45. (buffer-var "mark-ring" ring)
  46.   }
  47.   MAIN
  48.   {
  49.     (register-hook IBUFFER-CREATED-HOOK "markring-init")
  50.     (register-hook IREAD-FILE-HOOK    "markring-init")
  51. ;;;!!! need a buffer-cleared-hook
  52.  
  53.     (bind-to-key "markring-push"        "F-9")
  54.     (bind-to-key "markring-push"        "M-C-p")
  55.     (bind-to-key "markring-pop"            "M-p")
  56.   }
  57. )
  58.  
  59.  
  60.     ;; Put a mark in the mark ring.
  61. (defun
  62.   markring-push
  63.   {
  64.     (int mark)
  65.     (list ring)
  66.  
  67. ;    (ring (loc (buffer-var "mark-ring")))
  68.     (ring (buffer-var "mark-ring"))
  69.  
  70.     (if (< (length-of ring) NUMBER-OF-MARKS-IN-RING)    ;; need a new mark
  71.     (mark (create-mark TRUE))    ;; a new mark
  72.     (mark (pop-mark ring)))        ;; ring full, reuse oldest mark
  73.     (push-mark ring mark)
  74. (buffer-var "mark-ring" ring)
  75.  
  76.     (set-mark mark)
  77.     (msg "Mark queued.")
  78.   }
  79. )
  80.  
  81.  
  82. (defun
  83.   markring-pop    ;; Cycle through the mark ring
  84.   {
  85.     (int mark)
  86.     (list ring)
  87.  
  88. ;; !!! (if (no-markring) (markring-init))
  89.  
  90. ;    (ring (loc (buffer-var "mark-ring")))
  91.     (ring (buffer-var "mark-ring"))
  92.  
  93.     (if (== 0 (length-of ring)) { (msg "Mark ring empty.")(done) })
  94.  
  95.     (mark (pop-mark ring))
  96.     (push-mark ring mark)
  97. (buffer-var "mark-ring" ring)
  98.  
  99.     (goto-mark mark)
  100.   }
  101. )
  102.  
  103. (defun
  104.   markring-delete   ;; remove youngest mark from ring (usually just popped)
  105.   {
  106.     (int num-marks mark n)
  107.     (list ring)
  108.  
  109. ;    (ring (loc (buffer-var "mark-ring")))
  110.     (ring (buffer-var "mark-ring"))
  111.  
  112.     (num-marks (length-of ring))    ;; number of marks in ring
  113.     (if (== 0 num-marks) { (msg "Mark ring empty.")(done) })
  114.  
  115.     (n (- num-marks 1))
  116.  
  117.     (mark (extract-element ring n)) (free-mark mark)
  118.     (remove-elements ring n 1)
  119.  
  120. (buffer-var "mark-ring" ring)
  121.   }
  122. )
  123.  
  124. (defun
  125.   push-mark (list ring)(int mark)    HIDDEN
  126.   {
  127.     (insert-object ring 10000 mark) ;; add to end of ring
  128.   }
  129.   pop-mark (list ring)            HIDDEN
  130.   {
  131.     (int mark)
  132.  
  133.     (mark (extract-element ring 0))
  134.     (remove-elements ring 0 1)
  135.     mark
  136.   }
  137. )
  138.